package com.kzx.blog.util;

import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.validation.constraints.NotNull;
import java.util.concurrent.TimeUnit;

/**
 * @author kongz
 * @version 1.0 2021/11/30 19:10
 * @description redis使用工具类
 */
@Component
public class RedisUtils {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 写入缓存
     * @param key key值
     * @param value 对应的value
     */
    public void set(String key, String value) {
        try {
            redisTemplate.opsForValue().set(key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 写入缓存, 设置过期时间
     * @param key key值
     * @param value 对应value值
     * @param delayTime 过期时间
     * @param timeUnit 时间单位
     */
    public void set(String key, String value, long delayTime, TimeUnit timeUnit) {
        try {
            redisTemplate.opsForValue().set(key, value, delayTime, timeUnit);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 判定缓存中key值是否存在
     * @param key key值
     * @return boolean
     */
    public boolean isExist(String key) {
        if (key == null) return false;
        return redisTemplate.hasKey(key);
    }

    /**
     * 从缓存中获取key对应的value值
     * @param key key值
     * @return value
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 从缓存中获取key值对应的对象
     * @param key key值
     * @param clazz 对象class
     * @return 对应对象
     */
    public <T> T get(String key, Class<T> clazz) {
        String result = redisTemplate.opsForValue().get(key);
        return JSONObject.parseObject(result, clazz);
    }

    /**
     * 批量删除key值
     * @param keys 多个key值
     */
    public void remove(String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 删除对应key值
     * @param key key值
     */
    public void remove(String key) {
        if (isExist(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 将对象转换为字符串
     * @param obj 对象
     * @return 字符串
     */
    public String ObjectToString(Object obj) {
        return JSONObject.toJSONString(obj);
    }

}
